<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    //工厂函数:模子,同一个工厂生产出独立的产品,产品最初的属性,方法都是一样的.
    //只有函数有protoType对象
    function A(name, age) {
        // 显示的声明在了构造函数里
        this.name = name;
        this.age = age;
        this.getLx = function () {
            return `${this.name}今年${this.age}岁了`
        }
    }
    A.prototype.job = 'web'
    A.prototype.run = function () {
        return `${this.name}身为${this.job},竟然只跑了五米,用时25分钟`
    }
    //函数被new之后,还函数被称为构造函数
    const lx = new A('张龙龙', 18)
    //new 这个动作就是实例化,返回的对象叫做实例对象 lx
    console.log(lx.run())

    // class 类 基于 函数的prototype封装的
    class Lj {
        //构造函数
        constructor(name, age) {
            this.name = name;
            this.age = age;
            this.getLj = function () {
                return `${this.name},今年${this.age}岁了`
            }
        }

        // 在class内部在勾函数外部写的属性和方法就等价于在函数的protoType上加的
        job = '教授';
        run() {
            return `${this.name}身为${this.job}仅仅跑了6米,领先了${lx.name}`
        }

    }
    const lj = new Lj("阿菊", 26);
    console.log(lj.getLj())
    console.log(lj.run())
    //继承 extend继承关键字
    //xj 叫做派生类 基于Lj派生出来的
    // xj叫子类Lj叫父类
    class xj extends Lj {
        //派生类如果需要显示的去写构造函数,就必须调用super方法
        constructor(name, age) {
            super()
            this.name = name;
            this.age = age
            this.getThis = () => {
                return `${this.name}今天过${this.age}岁生日`
            }
        }

    }
    const obj = new xj('小聚', 16)
    console.log(obj.getThis())
    // console.log(Lj.getThis())
</script>

</html>